"""
和文件相关的类定义
其实就是那2个 销售文件,文件格式不同 我们需要2个 子类分别实现,2个不同格式的数据读取

相关文件
D:/python黑马/资料数据/2011年1月销售数据.txt     (csv格式)
D:/python黑马/资料数据/2011年2月销售数据JSON.txt  (json格式)
数据相关的类.py
"""
# 导包, 把 "类_记录" 导过来下面 "-> list[类_记录]" ,这里才不会报错
from 二阶段_第一章_类.综合案例_数据分析.数据相关的类 import 类_记录  # 也可以 * 代表文件里的全部
import json


# 先定义一个抽象类 用来做顶层设计,确定有那些功能需要实现   同时也是父类
class 类_文件读取器:
    """抽象类"""
    def 数据读取(self) -> list[类_记录]:  # 注解返回值是 list(列表)  注:列表里的元素都是 对象. "类_记录" 的对象
        """读取文件的数据,读到的每一条数据,转换成 "类_记录" 对象. 这样我们得到的对象非常的多,把它们封装到list(列表)内返回即可"""
        pass


# 子类
class csv格式文件读取(类_文件读取器):
    文件路径 = None  # 定义一个变量,用来存储文件的路径.

    def __init__(self, 文件路径):
        """输入文件的路径"""
        self.文件路径 = 文件路径

    # 复写 (实现抽象类 也就是父类的方法)
    def 数据读取(self) -> list[类_记录]:
        # self 关键字一定要加.因为这个是类的内部.调用自己的内部变量
        文件对象 = open(self.文件路径, "r", encoding="UTF-8")
        列表_类_记录的对象 = []  # type: list[类_记录]     # 这个是返回值, 列表, 元素是 类对象

        for 列表元素 in 文件对象.readlines():  # 读取全部数据,每一行作为一个元素 整体是个列表
            列表元素 = 列表元素.strip()  # 去掉每一行,元素的 回车符\n    元素是字符串

            列表元素_split的新列表 = 列表元素.split(",")  # 分割字符串,组成新列表,方便对 类对象的赋值

            # 对类的对象赋值         另外第3个参数是 金额 所以要int类型,不然是字符串
            类_记录_对象 = 类_记录(列表元素_split的新列表[0], 列表元素_split的新列表[1], int(列表元素_split的新列表[2]), 列表元素_split的新列表[3])
            # 所有的对象 封装到列表里
            列表_类_记录的对象.append(类_记录_对象)  # 列表追加不需要重新赋值 列表=列表.append 不用这样,列表不是字符串

        文件对象.close()  # 关闭文件释放内存资源
        return 列表_类_记录的对象  # 函数 返回值是列表


# 子类
class json格式文件读取(类_文件读取器):
    文件路径 = None  # 定义一个变量,用来存储文件的路径.

    def __init__(self, 文件路径):
        """输入文件的路径"""
        self.文件路径 = 文件路径

    # 复写 (实现抽象类 也就是父类的方法)
    def 数据读取(self) -> list[类_记录]:
        文件对象 = open(self.文件路径, "r", encoding="UTF-8")
        列表_类_记录的对象 = []  # type: list[类_记录]

        for 字典元素 in 文件对象.readlines():
            # 字典元素 = 字典元素.strip()   # 去掉每一行,元素的 回车符\n    元素是字符串

            # "字典元素" 实际是字符串    我们把这个 json格式转换成python格式 (就是列表)
            # python数据 = json.loads(字典元素)

            # 字典 = dict(python数据)  # 强制转换成字典类型,下面打印输出证明数据成功成为字典类型
            # print(字典['date'], 字典['order_id'], int(字典['money']), 字典['province'])

            字典 = json.loads(字典元素)  # 这种直接转换成 字典类型,上面的实际不需要了

            # 对类的对象赋值     另外第3个参数是 金额 所以要int类型,不然是字符串
            类_记录_对象 = 类_记录(字典['date'], 字典['order_id'], int(字典['money']), 字典['province'])
            # 所有的对象 封装到列表里
            列表_类_记录的对象.append(类_记录_对象)  # 再次提醒: 列表追加不需要重新赋值 列表=列表.append 不用这样,列表不是字符串

        文件对象.close()  # 关闭文件
        return 列表_类_记录的对象  # 返回值


# 内部测试
if __name__ == '__main__':
    一月份销售数据 = csv格式文件读取("D:/python黑马/资料数据/2011年1月销售数据.txt")
    # 一月份销售数据.数据读取()
    # print(一月份销售数据.数据读取())

    二月份销售数据 = json格式文件读取("D:/python黑马/资料数据/2011年2月销售数据JSON.txt")
    # 二月份销售数据.数据读取()
    print(二月份销售数据.数据读取())

    for 元素 in 二月份销售数据.数据读取():
        print(元素)
